package 中等.哈希表;


import java.util.HashMap;
import java.util.Map;

/**
 * 给你一个长度为 n 的字符串数组 names 。你将会在文件系统中创建 n 个文件夹：
 * 在第 i 分钟，新建名为 names[i] 的文件夹。
 * 由于两个文件 不能 共享相同的文件名，因此如果新建文件夹使用的文件名已经被占用，
 * 系统会以 (k) 的形式为新文件夹的文件名添加后缀，其中 k 是能保证文件名唯一的 最小正整数 。
 * 返回长度为 n 的字符串数组，其中 ans[i] 是创建第 i 个文件夹时系统分配给该文件夹的实际名称。
 * <p>
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode.cn/problems/making-file-names-unique
 */
public class 保证文件名唯一_1487 {

    public static void main(String[] args) {

        System.out.println(getFolderNames(new String[]{"kingston", "kingston(1)", "kingston"}));

    }

    /**
     * 哈希表
     * 1，如果哈希表中不存在当前 name , 那么 put(name,1) , 代表
     * 下次出现 name , k 从 1 开始计数
     * 2，如果哈希表中存在当前 name , 那么判断 name 的 k 是否已经
     * 存在，存在则 k++ , 直至不重复 , 这里产生了两个记录
     * 原 name 的 k++ 和 put(name(k),1)
     * 注意：k 不需要每次以 1 为起点，递增判断，但是需要判断
     * 比较大的 k 已经记录的情况
     */
    public static String[] getFolderNames(String[] names) {
        Map<String, Integer> map = new HashMap<>();
        String[] ans = new String[names.length];
        for (int i = 0; i < names.length; i++) {
            if (map.containsKey(names[i])) {
                int k = map.get(names[i]);
                while (map.containsKey(names[i] + "(" + k + ")")) {
                    k++;
                }
                map.put(names[i], k);

                ans[i] = names[i] + "(" + k + ")";
                map.put(ans[i], 1);

            } else {
                map.put(names[i], 1);

                ans[i] = names[i];
            }
        }
        return ans;
    }

}
